package com.ize.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ize.entity.dto.ReservationQueryDTO;
import com.ize.entity.pojo.Reservation;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

@Mapper
public interface YuYueMapper extends BaseMapper<Reservation> {

    /**
     * 分页查询预约列表
     * @param page 分页参数
     * @param query 查询条件
     * @return 分页结果
     */
    Page<Reservation> selectByCondition(Page<Reservation> page, @Param("query") ReservationQueryDTO query ,Long createUserId);

    /**
     * 统计各状态预约数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param doctorId 医生ID
     * @return 统计结果
     */
    Map<String, Long> countByStatus(@Param("startTime") LocalDateTime startTime,
                                    @Param("endTime") LocalDateTime endTime,
                                    @Param("doctorId") Long doctorId);

    /**
     * 统计各科室预约数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param doctorId 医生ID
     * @return 科室分布
     */
    List<Map<String, Object>> countByDept(@Param("startTime") LocalDateTime startTime,
                                          @Param("endTime") LocalDateTime endTime,
                                          @Param("doctorId") Long doctorId);

    /**
     * 统计每日预约数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param doctorId 医生ID
     * @return 时间分布
     */
    List<Map<String, Object>> countByDate(@Param("startTime") LocalDateTime startTime,
                                          @Param("endTime") LocalDateTime endTime,
                                          @Param("doctorId") Long doctorId);

    /**
     * 查询指定日期医生的已占用时间段
     * @param doctorId 医生ID
     * @param date 日期
     * @param currentAppointmentId 当前预约ID(编辑时排除)
     * @return 已占用的时间段
     */
    List<String> getOccupiedTimeSlots(@Param("doctorId") Long doctorId,
                                      @Param("date") LocalDateTime date,
                                      @Param("currentAppointmentId") Long currentAppointmentId);
}
